<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // 链式操作的原理 -> 方法的的返回值还是同种类型的数据 (原本/新的)
    var arr = []
    arr.concat(1,2)
    arr.concat(1,2).concat(3,4)

    "DD天HH小时mm分ss秒".replace("DD",1)
    "DD天HH小时mm分ss秒".replace("DD",1).replace("HH",2);


    var p = new Promise(function(resolve,reject){
        setTimeout(()=>{
            resolve(1);
        },2000)
    })

    console.log(p);

    // then() 方法的返回值是一个新的Promise实例 => 新的Promise实例可以继续定义then方法 => 前一个回调函数的结果 (执行过程没有发生错误)

    p.then(function(v){  
        console.log("fulfilled",v);
        // return 2;     //返回值非Promise实例 => 直接向后传入 
        return new Promise(function(resolve,reject){  // 返回值是Promise实例 => 当该Promise实例状态改变之后,再决定走then还是catch
            setTimeout(()=>{
                resolve(2);
                // reject(2);
            },3000)
        });  
    }).then(function(v){
        console.log("fulfilled",v);
        return 3;
    }).then(function(v){
        console.log("fulfilled",v);
        return 4;
    }).then(function(v){
        console.log("fulfilled",v);
        return 5;
    }).then(function(v){
        console.log("fulfilled",v);
    }).catch(function(err){
        console.log("rejected",err);
    })





    // 不同类型的链式操作(看返回值)
    // "abcdefg".split("").reverse().join("")



</script>
</html>